#ifndef _MEDIA_SYS_H_
#define _MEDIA_SYS_H_

#include <stdio.h>
#include <stdlib.h>
#include <dirent.h>
#include <sys/ioctl.h> //ioctl
#include <sys/types.h>
#include <sys/stat.h>
#include <sys/mman.h> //映射mmap
#include <fcntl.h>
#include <unistd.h>
#include <stdbool.h>
#include <math.h>
#include <time.h>
#include <string.h>
#include <pthread.h>
#include <linux/input.h> //触摸屏设备头文件
#include <linux/fb.h>    //lcd设备头文件

#define LCD_DEV_PATH "/dev/fb0"                // LCD设备路径
#define TOUCH_LCD_DEV_PATH "/dev/input/event0" // 触摸屏设备路径
#define LCD_PIXEL_SIZE 4                       // LCD像素点4个字节
#define BMP_PIXEL_SIZE 3                       // BMP像素点3个字节
#define DEFAULT_SEARCH_BMP_PATH "/tmp/ys"
#define PIC_FILE_TYPE ".bmp"
#define DZK_DEV_PATH "/tmp/ascii.Dzk"
#define DZK_CHINESE_PATH "/tmp/2312.Dzk"  

typedef struct media_sys_inf
{
      int lcd;             // LCD文件描述符
      int *mmap_start_poi; // LCD 映射指针
      int lcd_w;           // LCD宽
      int lcd_h;           // LCD高

      int ts;      // 触摸屏文件描述符
      int touch_x; // 触摸屏X坐标
      int touch_y; // 触摸屏Y坐标
      int touch_l;

} MEDIA_STR, *MEDIA_POI;

typedef struct bmp_inf
{
      char bmp_path[256];

      struct bmp_inf *next;
      struct bmp_inf *prev;
} BMP_NODE, *BMP_LINK;


// 给相册功能模块定义一个结构体
typedef struct album_inf
{
      BMP_LINK bmp_list_head; // 图片的链表头结点
      int photo_sum;          // 相册图片的总个数
      int photo_page_sum;     // 页面总个数
} AI, *P_AI;


struct chinese_show_inf
{
      int  lcd;
      int  lcd_w;
      int  * lcd_mmap_poi;
      int  * lcd_mmap_poi_w;

      int dzk;
      int dzk_w;
      int dzk_file_size;
      int dzk_file_size_w;
      char * dzk_mmap_poi;
      char * dzk_mmap_poi_w;

      unsigned int font_color; //字体颜色
      unsigned int broadground_color; //背景颜色
}CSI;

      // 定义一个结构体来传递参数给线程函数
      typedef struct 
      {
      int lcd_x;
      int lcd_y;
      int x0;
      int y0;
      int r;
      int color;
      MEDIA_POI mp;  // 新增，用于获取一些必要信息
      int board_x;  // 木板的 x 坐标
      int board_y;  // 木板的 y 坐标
      int board_width;  // 木板的宽度
      int board_height; // 木板的高度
      int *score; // 新增分数指针
      } GameBeginArgs;

      extern int game_thread_exit;
/***********************************commom.c********************************** */
MEDIA_POI Media_Sys_Init();                          // 项目初始化  --- 硬件设备初始化
bool Media_Sys_Free(MEDIA_POI mp);                   // 项目结束释放 --- 硬件设备结束释放
bool Show_Ui(MEDIA_POI mp, const char *ui_pic_path); // 画界面函数
bool Get_Touch_Xy(MEDIA_POI mp);                     // 获取触摸屏坐标
bool Main_Touch_Ctrl(MEDIA_POI mp);                  // 主界面触摸控制
bool Lcd_Clean(MEDIA_POI mp, int color);             // 刷指定颜色全屏
bool Char_Show(char char_data,int where_x,int where_y); // 显示字符
bool Chinese_Show_Init(unsigned int font_color,unsigned int broadground_color);//ascii吗初始化
void* time_display_thread(void* arg);                // 显示时间线程
void* word_display_thread(void* arg);                // 显示中文线程                               
bool Show_Progress_Bar(MEDIA_POI mp, int progress);  // 显示进度条
bool Show_bmp(const char * bmp_path,int seat_x,int seat_y); // 显示bmp图片
bool Chinese_Show(char * font,int where_x,int where_y);   // 显示中文
bool Word_Show_Init(unsigned int font_color,unsigned int broadground_color); //2312编码初始化
bool Show_Exit_Confirm_Ui(MEDIA_POI mp);
/***********************************album.c********************************** */
bool Album(MEDIA_POI mp);                                                                       // 相册总接口
P_AI Album_Init(MEDIA_POI mp);                                                                  // 相册初始化接口   --- 创建图片链表的头结点，图片文件的目录检索
bool Album_Free(P_AI p_ai);                                                                     // 相册结束释放接口
bool Album_Touch_Ctrl(MEDIA_POI mp, P_AI p_ai);                                                 // 相册界面触摸控制
BMP_LINK Create_Bmp_Node();                                                                     // 创建图片链表节点
bool Bmp_File_Search(P_AI p_ai);                                                                // bmp图片的检索 = 数量统计 图片链表的形成
bool Add_Bmp_Node(P_AI p_ai, BMP_LINK new_node);                                                // 尾插法添加图片链表节点
bool Show_Page_Thumbnail(MEDIA_POI mp, P_AI p_ai, int page_num);                                // 指定显示某一页的缩略图
bool Show_One_Thumbnail(MEDIA_POI mp, const char *bmp_path, int zoomout, int bmp_x, int bmp_y); // 缩放显示
bool show_btn(MEDIA_POI mp);                                                      // 显示相册左边按钮
bool show_bmp(MEDIA_POI mp, const char *path, int x, int y);                                    // 显示bmp图片
int  get_touch_action(MEDIA_POI mp, int *x1, int *y1, int *x2, int *y2);                         // 获取坐标并获取滑动坐标
bool part_clean(MEDIA_POI mp, int color, int x1, int y1, int x2, int y2);                       // 部分屏幕刷指定颜色
void Zoom_Show_bmp(MEDIA_POI mp, const char *pathname, double pzoom, int x, int y);             // 缩放显示(0.9-0.1倍显示)
bool Zoom_Show_left_right_strokes(MEDIA_POI mp, P_AI p_ai, BMP_LINK bmp_p);                     // 放大图片显示后左划右划
bool Delete_Selected_Image(MEDIA_POI mp, P_AI p_ai, int page_num, int touch_x, int touch_y);
bool Show_Photo_Count(MEDIA_POI mp, int photo_sum);
/***********************************game.c********************************** */
bool Game(MEDIA_POI mp);            // 游戏总接口
bool Game_Touch_Ctrl(MEDIA_POI mp); // 游戏界面触摸控制
void* Game_Begin_Thread(void* arg);
bool draw_buttons_to_buffer(MEDIA_POI mp, unsigned int * buffer);
bool show_bmp_to_buffer(MEDIA_POI mp, unsigned int * buffer, const char *path, int x, int y);
unsigned int *read_bmp_file(const char *path);
int get_bmp_width(const char *path);
int get_bmp_height(const char *path);
bool Show_String(MEDIA_POI mp, char *str, int x, int y);
#endif